// 该子类用于加载用户数据

// 关闭VSCode非必要报错
// ignore_for_file: unnecessary_import, camel_case_types, non_constant_identifier_names, constant_identifier_names, unnecessary_brace_in_string_interps

import 'dart:io';
import 'package:path/path.dart';    // 拼接路径用扩展
import 'package:project_award_statistics/utils/load_user_info_from_db/user_model.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';    // 导入数据库用扩展
import 'package:sqflite/sqflite.dart';

class DBProvider_UserInfo {
  initDB() async     // initDB函数用于打开存储用户密码用的数据库并返回一个数据库对象
    {
      // 检测到桌面端平台则进行sqflite插件的ffi子插件加载操作
      if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) 
        {
          sqfliteFfiInit();
          databaseFactory = databaseFactoryFfi;
        }

      // 异步打开/新建award_info数据库文件到应该存储数据库的地方并作为对象返回
      return await openDatabase(
        join(await getDatabasesPath(), 'user_info.db'),
        onCreate: (db, version) async {
          await db.execute(
            'CREATE TABLE user_info (name TEXT,password TEXT)',
          );
        },
        version: 1,
      );
    }

  Future <List<user_info_model>> get_user_list() async 
    {
      var database = await initDB();
      final List<Map<String, Object?>> user_info_maps = await database.query("user_info");

      return [
        for (final {'name': stu_name as String, 'password': password as String,}                     
            in user_info_maps)
          user_info_model(stu_name: stu_name, password:password),
      ];
    }

  // 该函数用于插入新的获奖数据,需要传入user信息模型类的用户数据对象
  Future <void> insert_new_user (user_info_model new_user) async 
    {
      final database = await initDB();   //等待异步执行完成
      await database.insert(
        'user_info',
        new_user.info_to_map(),
        conflictAlgorithm: ConflictAlgorithm.replace,
      );
      return;
    }

  // 该函数用于修改对应学生名字的密码,以便于在忘记密码页面功能中调用
  Future <void> change_passwd (String stu_name,String new_passwd) async
    {
      Database database = await initDB();
      await database.execute("UPDATE user_info SET password='${new_passwd}' WHERE name='${stu_name}'");     // 进行密码更改
      return;
    }
}
